如何从 Unity 中的 Watson Conversation 服务获取 $context 变量?

How to get $context variables from the Watson Conversation Service in Unity?

我试图在我的 Unity 项目中获取我在 Watson Conversation Dialogs 中创建的上下文变量。我能够让整个 JSON 对话框显示在 Unity 中,从 json 文件中获取意图、实体和输出文本。因此,我没有从 json 文件中获取输出:{ text[],而是尝试从 JSON 文件中获取上下文:{ variable:value 但我做不到让我想想如何。

这是欢迎对话框节点的 JSON 文件,我想从中读取 destination_city 变量以将其设置为等于 Unity variable/string。

{
   "context": {
     "date": null,
     "time": null,
     "hotel": null,
     "DateEnd": null,
     "DateBegin": null,
     "PeriodDate": null,
     "numberKids": null,
     "roomsHotel": null,
     "PeriodNumber": null,
     "numberAdults": 0,
     "departure_city": null,
     "transportation": null,
     "destination_city": "London",
     "kidDiscountRepeat": null
   },
   "output": {
     "text": {
       "values": [
         "Hello, this is the Watson Travel agency."
       ],
       "selection_policy": "sequential"
     }
   }
 }

这是我在 Unity 中获得 Watson 对话响应并显示该对话节点的整个 JSON 文件的代码的一部分:

void HandleMessageCallback (object resp, Dictionary customData) 
{ object _tempContext = null; (resp as Dictionary ).TryGetValue("context", out _tempContext);

     if (_tempContext != null)
         conversationContext = _tempContext as Dictionary<string, object>;

     Dictionary<string, object> dict = Json.Deserialize(customData["json"].ToString()) as Dictionary<string, object>;

     // load output --> text;answer from Json node
     Dictionary <string, object> output = dict["output"] as Dictionary<string, object>;
     List<object> text = output["text"] as List<object>;
     string answer = text[0].ToString();
     Debug.Log("WATSON | Conversation output: \n" + answer);

     //======== Load $ context variable attempts =============================
     Debug.Log("JSON INFO: " + customData["json"].ToString());
     //=====================================

     if (conversationOutputField != null)
     {
         conversationOutputField.text = answer;
     }

解决方案 1:保留您的代码

使用您当前的代码,您应该能够使用

访问您的上下文
var context = dict["context"] as Dictionary<string, object>

现在您有了上下文,您可以用同样的方式访问它的内容

var mycity = context["destination_city"]

结论 1

即使这确实有效,但如果您正在设置一个解决方案,您将要 manipulate/access Json,我强烈建议为您的数据制作模型以进行序列化和序列化,为此,查看Unity的JsonUtility(Json序列化)

解决方案 2:将 C# 对象与 Json

序列化

我们以Unity的手册为例:

数据模型Class

首先,我们创建一个 Model class 我们想要的 Json 信息,在这种情况下,我们想要关于我们玩家的信息,为此我们创建了 3 个字段, int levelfloat timeElapsedstring playerName

[Serializable]
public class MyClass
{
    public int level;
    public float timeElapsed;
    public string playerName;
}

数据初始化

这里我们创建了一个名为 myObject 的 class MyClass 的新实例,并手动设置它的字段值(事实上,您如何设置值在这里并不重要)

MyClass myObject = new MyClass();
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";

将您的 class 序列化为 Json

要序列化您的 myObject,只需将其作为参数

传递给 JsonUtility.ToJson 方法
string json = JsonUtility.ToJson(myObject);

现在,我们的 class 对象相当于 Json 字符串:

{"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}

正在从您的 class

生成 Json

如果您想用 Json 中的数据填充 C# 对象,您可以通过调用 JsonUtility.FromJson<TypeOfTheClassImMappingTo> 方法并将其传递给 json 字符串作为参数。

myObject = JsonUtility.FromJson<MyClass>(json);

这些只是基本操作,您可以使用 Json 实用程序的 Class/Json 序列化

进行表面处理

结论 2

这个解决方案更易于维护。您可以扩展它以使用任意数量的模型类型,并利用 C# 对象的优势和轻松导航。这对于创建将使用您的数据对象的系统特别有趣。

如果您对 Json 实用程序有疑问,例如如何管理数组、嵌套数据等。我强烈建议您花几分钟时间通读 实践。

资源

[Unity - Manual] JsonUtility / JsonSerialization

[Whosebug] 在 Unity 中序列化和反序列化 Json 和 Json 数组